package com.sibu.yx.promotion.common.util;

/**
 * 经纬度工具类
 *
 * @author liajuncong
 * @create 2017/8/24
 */
public class DistanceUtil {
    /**
     * 默认地球半径
     */
    private final static double EARTH_RADIUS = 6378.137;

    /**
     * 通过经纬度计算四个边界
     *
     * @param longitude 纬度
     * @param latitude  经度
     * @param distance  直线距离 (公里)
     * @return 四个边界
     */
    public static DistanceAround getAround(double longitude, double latitude, double distance) {
        // 计算经度弧度,从弧度转换为角度
        double dlng = 2 * Math
            .asin(Math.sin(distance / (2 * EARTH_RADIUS)) / Math.cos(Math.toRadians(latitude)));
        // 计算纬度角度
        dlng = Math.abs(Math.toDegrees(dlng));
        double dlat = distance / EARTH_RADIUS;
        dlat = Math.abs(Math.toDegrees(dlat));
        double minlng = longitude - dlng;
        double maxlng = longitude + dlng;
        double minlat = latitude - dlat;
        double maxlat = latitude + dlat;

        return new DistanceAround(minlng, maxlng, minlat, maxlat);
    }

    /**
     * 计算一个坐标是否在坐标范围里面
     * @param distanceAround
     * @param lng
     * @param lat
     * @return
     */
    public static boolean calcCoordinateAvailable(DistanceAround distanceAround, double lng,
                                                  double lat) {
        if ((lng >= distanceAround.getMinlng() && lng <= distanceAround.getMaxlng())
            && lat >= distanceAround.getMinlat() && lat <= distanceAround.getMaxlat()) {
            return true;
        }
        return false;
    }

    public static double calDistance(double longitude1, double latitude1, double longitude2,
                                     double latitude2) {
        // 纬度
        double lat1 = rad(latitude1);
        double lat2 = rad(latitude2);
        // 两点纬度之差
        double a = lat1 - lat2;
        // 经度之差
        double b = rad(longitude1) - rad(longitude2);
        // 计算两点距离的公式
        double s = 2 * Math
            .asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
                            + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(b / 2), 2)));
        //弧长乘地球半径（半径为米）
        s = s * EARTH_RADIUS;
        // 精确距离的数值
        s = Math.round(s * 10000d) / 10000d;
        return s;

    }

    private static double rad(double d) {
        // 角度转换成弧度
        return d * Math.PI / 180.00;

    }

    public static void main(String[] args) {
        //        DistanceAround distanceAround = DistanceUtil.getAround(23.3965, 113.24246, 2);
        //        System.out.println(distanceAround);
        //        System.out.println(DistanceUtil.calcCoordinateAvailable(distanceAround, 23.39757, 113.24414));

        //        System.out.println(DistanceUtil.calDistance(23.3965, 113.24246,23.4385560001115,113.328946669748));
    }
}
